/**@file
 * @brief class EtTcl声明及常量定义.
 * @author 朱项男<libxiangnan@gmail.com>
 * @date 2011/11/17
 * @version 0.0.1
 * @note 在执行脚本对象时通常会调用该类中的函数,该常量会引用tcl头文件及共享库,故在编译环境中应包含这些
 *
 * EtTcl类及常量声明
 * */

#ifndef ETTCL_H_
#define ETTCL_H_

#include <tcl.h>
#include <string>

#include "script.h"
#include "result.h"

using namespace std;
using namespace dat;
namespace tcl{
/**@class EtTcl etTcl.h etTcl.h
 * @brief 执行脚本对象类
 * @author 朱项男<libxiangnan@gmail.com>
 * @note
 * */
class Interp {
private:
	Tcl_Interp* m_Interp;			///< Tcl解释器
	std::string m_Libpath;		///< 存储Tcl解释器auto_path
	dat::Script m_LstScr;			///< 最后一次执行的脚本对象
	static const std::string M_TOTAL;	///< 常量标记，通过它可以获取被解释的脚本中断言总数
	static const std::string M_SUCCESS;	///< 常量标记，通过它可以获取被解释的脚本中断言成功的数量
	static const std::string M_FAILURE;	///< 常量标记，通过它可以获得被解释的脚本中断言失败的数量
	static const std::string M_LOGPATH;	///< 常量标记，通过它可以获取脚本中日志路径
public:
	//!
	Interp();

	//!
	Interp(Tcl_Interp* interp, const std::string &libpath);

	//!
	~Interp();

	//! 创建Tcl解释器，成员解释器会被创建
	bool CreateTclInterpreter();

	//! 在创建Tcl解释器后可增加配置信息
	void ConfigInterp();

	//! 执行一个脚本对象
	bool ExecuteScript(dat::Script &scr);

	//! 获取最后一次执行的脚本对象的结果
	dat::Result GetLastScriptResult();

	//! m_InterpPtr Getter
	const Tcl_Interp* const GetTclInterp();

	//! 检查Tcl解释器检查
	bool CheckTclInterp();

	//! m_LibPath Setter
	void SetLibPath(const std::string &libpath);

	//! m_LibPath Getter
	std::string GetLibpath();

	//! m_LstScr Getter
	dat::Script GetLstScr();
};

}
#endif /* ETTCL_H_ */
